package com.fling.abcde.ui.citypicker.db;

import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.os.Environment;

import com.fling.abcde.ui.citypicker.model.City;
import com.lib.utils.CloseUtils;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

public class DBManager {

	private static final String ASSETS_NAME = "china_cities.db";
	private static final String DB_NAME = "china_cities.db";
	private static final String TABLE_NAME = "city";
	private static final String NAME = "name";
	private static final String PINYIN = "pinyin";
	private static final int BUFFER_SIZE = 1024;
	private String DB_PATH;
	private Context mContext;

	public DBManager(Context context) {

		this.mContext = context;
		DB_PATH = File.separator + "data" + Environment.getDataDirectory().getAbsolutePath() + File.separator
			+ context.getPackageName() + File.separator + "databases" + File.separator;
	}

	public void copyDBFile() {

		File dir = new File(DB_PATH);
		if (!dir.exists()) {
			dir.mkdirs();
		}
		File dbFile = new File(DB_PATH + DB_NAME);
		if (!dbFile.exists()) {
			InputStream is = null;
			OutputStream os = null;
			try {
				is = mContext.getResources().getAssets().open(ASSETS_NAME);
				os = new FileOutputStream(dbFile);
				byte[] buffer = new byte[BUFFER_SIZE];
				int length;
				while ((length = is.read(buffer, 0, buffer.length)) > 0) {
					os.write(buffer, 0, length);
				}
				os.flush();
			} catch (IOException e) {//
			} finally {
				CloseUtils.closeIOQuietly(os, is);
			}
		}
	}

	public ArrayList<City> getAllCities() {

		SQLiteDatabase db = SQLiteDatabase.openOrCreateDatabase(DB_PATH + DB_NAME, null);
		Cursor cursor = db.rawQuery("select * from " + TABLE_NAME, null);
		ArrayList<City> result = new ArrayList<>();
		City city;
		while (cursor.moveToNext()) {
			String name = cursor.getString(cursor.getColumnIndex(NAME));
			String pinyin = cursor.getString(cursor.getColumnIndex(PINYIN));
			city = new City(name, pinyin);
			result.add(city);
		}
		cursor.close();
		db.close();
		Collections.sort(result, new CityComparator());
		return result;
	}

	public List<City> searchCity(final String keyword) {

		SQLiteDatabase db = SQLiteDatabase.openOrCreateDatabase(DB_PATH + DB_NAME, null);
		Cursor cursor = db.rawQuery("select * from " + TABLE_NAME + " where name like \"%" + keyword
			+ "%\" or pinyin like \"%" + keyword + "%\"", null);
		List<City> result = new ArrayList<>();
		City city;
		while (cursor.moveToNext()) {
			String name = cursor.getString(cursor.getColumnIndex(NAME));
			String pinyin = cursor.getString(cursor.getColumnIndex(PINYIN));
			city = new City(name, pinyin);
			result.add(city);
		}
		cursor.close();
		db.close();
		Collections.sort(result, new CityComparator());
		return result;
	}

	/**
	 * sort by a-z
	 */
	private class CityComparator implements Comparator<City> {

		@Override
		public int compare(City lhs, City rhs) {

			String a = lhs.getPinyin().substring(0, 1);
			String b = rhs.getPinyin().substring(0, 1);
			return a.compareTo(b);
		}
	}
}
